﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using Fachada;
using ObjetoNegocio;

namespace CIRS.Algoritmos
{
    /// <summary>
    /// Interaction logic for UcAvaliarAlgoritmo.xaml
    /// </summary>
    public partial class UcAvaliarAlgoritmo : UserControl
    {
        public UcAvaliarAlgoritmo()
        {
            InitializeComponent();
        }

        public delegate void NotificarBusca(List<Algoritmo> algoritmos);
        public event NotificarBusca NotificarBuscaAlgoritmo;

        public event NotificarBusca NotificarPararBuscaAlgoritmo;

        private Busca Busca{ get; set;}
        private List<Algoritmo> Algoritmos{ get; set;}
        private List<Avaliacao> Avaliacoes{ get; set;}
        private IFachada _fachada;
        public IFachada Fachada
        {
            get
            {
                if (_fachada == null)
                {
                    _fachada = new Fachada.Fachada();
                }
                return _fachada;
            }
        }

        public UcAvaliarAlgoritmo(Busca busca,List<Algoritmo> algoritmos)
        {
            InitializeComponent();
            Busca = busca;
            Algoritmos = algoritmos;
            CarregarAlgoritmos();
            Avaliacoes = new List<Avaliacao>();
            Algoritmos.ForEach(CarregarAvaliacao);
        }

        private void CarregarAlgoritmos()
        {
            dgAlgoritmos.ItemsSource = Algoritmos;
        }

        private void CarregarAvaliacao(Algoritmo algoritmo)
        {
            var avaliacao = new Avaliacao
                                {
                                    Algoritmo = algoritmo,
                                    Busca = Busca,
                                    Data = DateTime.Now,
                                    Usuario = FrmPrincipal.UsuarioLogado,
                                    Gostou = false
                                };
            Avaliacoes.Add(avaliacao);
        }

        private void btnBuscar_Click(object sender, RoutedEventArgs e)
        {
            var algoritmos = Fachada.RecomendarAlgoritmos(Avaliacoes);
            if(NotificarBuscaAlgoritmo != null)
            {
                var todos = algoritmos.Union(Algoritmos).ToList();
                NotificarBuscaAlgoritmo(todos);
            }
        }

        private void CheckBox_Checked(object sender, RoutedEventArgs e)
        {
            var check = sender as CheckBox;
            ConfigurarAvaliacao(check.Tag as Algoritmo,true);
        }

        private void CheckBox_Unchecked(object sender, RoutedEventArgs e)
        {
            var check = sender as CheckBox;
            ConfigurarAvaliacao(check.Tag as Algoritmo, false);
        }

        private void ConfigurarAvaliacao(Algoritmo algoritmo, bool gostou)
        {
            var avaliacao = Avaliacoes.Find(item => item.Algoritmo == algoritmo);
            if(avaliacao != null)
            {
                avaliacao.Gostou = gostou;
            }
        }

        private void btnPararBusca_Click(object sender, RoutedEventArgs e)
        {
            Avaliacoes.ForEach(Fachada.CadastrarAvaliacao);
            if(NotificarPararBuscaAlgoritmo != null)
            {
                NotificarPararBuscaAlgoritmo(Algoritmos);
            }
        }
            
    }
}